package com.eportal.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.eportal.exception.NotUniqueException;
import com.eportal.hibernate.Finder;
import com.framework.jqgrid.JqGridPager;

/**
 * 统一数据访问接口
 */
public interface BaseDAO {
    /**
     * 加载的持久化对象
     *
     * @param clazz--指定类
     * @param id--指定ID
     * @return
     */
    Object loadById(Class clazz, Serializable id);
    
    Object getById(Class clazz, Serializable id);

    /**
     * 加载满足条件的持久化对象
     *
     * @param hql语句
     * @return
     */
    Object loadObject(String hql);

    /**
     * 删除的持久化对
     *
     * @param clazz--指定类
     * @param id--指定ID
     */
    void delById(Class clazz, Serializable id);

    /**
     * 删除持久化对象
     *
     * @param clazz--指定类
     * @param conditions--指定条件
     */
    void delByConditions(String clazz, String conditions);

    /**
     * 删除持久化对象
     *
     * @param sql--sq语句
     * @param where--del条件
     */
    Integer delBySql(String sql, Object[] obj);

    /**
     * 保存或更新指定的持久化对象
     *
     * @param obj--指定类
     */
    void save(Object obj) throws Exception;
    
    /**
     * 删除对象
     * @param obj
     */
    public void delete(Object obj); 

    /**
     * 装载持久化对象列表
     *
     * @param clazz--指定类
     * @return
     */
    List listAll(String clazz);

    /**
     * 装载持久化对象列表
     *
     * @param clazz--指定类
     * @param parameter--指定条件
     * @return
     */
    List listAll(String clazz, String parameter);
    
    /**
     * 装载持久化对象列表
     * @param hql
     * @param pageNo--开始行数
     * @param pageSize--每页条数
     * @return
     */
    public List list(String hql, int pageNo, int pageSize) ;

    /**
     * 装载持久化对象列表
     *
     * @param clazz--指定类
     * @param parameter--指定条件
     * @param order--指定排序
     * @return
     */
    List listAll(String clazz, String parameter, String order);

    /**
     * 装载持久化对象列表
     *
     * @param clazz--指定类
     * @param parameter--指定条件
     * @param order--指定排序
     * @param sort--排序方式
     * @return
     */
    List listAll(String clazz, String parameter, String order, String sort);

    /**
     * 计数
     *
     * @param sql
     * @param objects
     * @return
     * @author dingyulei
     */
    int count(String sql);

    /**
     * 分页装载指定类的所有持久化对象
     *
     * @param clazz--指定类
     * @param pageNo--开始行数
     * @param pageSize--每页条数
     * @return
     */
    List listAll(String clazz, int pageNo, int pageSize);

    /**
     * 装载指定类的JqGridPager持久化对象
     *
     * @param clazz--指定类
     * @param jqGridPager--分页指定类
     * @return
     */
    List listAll(String clazz, JqGridPager jqGridPager);

    /**
     * 统计指定类的所有持久化对象
     *
     * @param clazz
     * @return
     */
    int countAll(String clazz);

    /**
     * 查询指定类的满足条件的持久化对象
     *
     * @param hql语句
     * @return
     */
    List query(String hql);
    
    /**
     * 获取第一个对象，无论满足条件的有几个，取第一个
     * @param hql
     * @return
     */
    Object getFirst(String hql);
    
    /**
     * 获取唯一的第一个对象，满足条件大于一个时，抛异常
     * @param hql
     * @return
     * @throws NotUniqueException 
     */
    Object getUniqueFirst(String hql) throws NotUniqueException;

    /**
     * 装载JqGridPager持久化对象
     *
     * @param sql语句
     * @param jqGridPager--分页指定类
     * @return
     */
    List query(String sql, JqGridPager jqGridPager);

    /**
     * 分页查询
     *
     * @param sql
     * @param jqGridPager--分页指定类
     * @param subquery--子查询语句或函数
     * @return
     */
    List query(String sql, JqGridPager jqGridPager, String subquery);

    /**
     * 分页装载持久化对象
     *
     * @param hql语句
     * @param pageNo--开始行数
     * @param pageSize--每页条数
     * @return
     */
    List query(String hql, int pageNo, int pageSize);

    /**
     * 统计hql语句结果
     *
     * @param hql语句
     * @return
     */
    int countQuery(String hql);

    /**
     * 更新数据
     *
     * @param hql语句
     * @return
     */
    int update(String hql);

    /**
     * 条件更新数据
     *
     * @param sql语句
     * @return
     */
    int updateBySql(String sql);

    /**
     * 批量更新或者批量新增
     *
     * @param sql语句
     * @param objs--字段
     * @param argTypes--对应objs的字段类型
     * @return
     * @author dingyulei
     */
    Object insertOrUpdateBySql(String sql, Object[] objs, int[] argTypes);


    /**
     * 更新对象
     *
     * @param entity
     */
    void update(Object entity);

    /**
     * 参数加载
     *
     * @param clazz
     * @param where
     * @return
     */
    List parameterLoad(String clazz, String where);

    /**
     * 使用sql查询
     *
     * @param sql
     * @return List<map>
     */
    List queryBySql(String sql);

    /**
     * 使用sql查询
     *
     * @param sql
     * @return List<object[]>
     */
    List queryBySqlObjs(String sql);

    void excute(String sql);
    
    /**
     * 用Finder对象查询数据
     * @param finder
     * @return
     */
    List find(Finder finder);
    /**
     * 查询count
     * @param finder
     * @return
     */
    int countQueryResult(Finder finder);
    
    public HibernateTemplate getTemplate();
    
    public Object findFirst(Finder finder);
    

	void rollback();

	/**
	 * 根据集合查询集合
	 */
	List executeFind(String sql, String string, List<Long> tmp);

	/**
	 * 参数查找
	 */
	List find(String string, Object[] array);

	long findSequence(String sequen);

	List executeFindS(String sql, String string, List<String> ids);
	
	Map<String, Object> callProcedure(String callStr, String[] inList, String[] outList) throws Exception;
}


